package br.uniceub.fsw.agenda.controller;

import br.uniceub.fsw.agenda.exception.BusinessException;
import br.uniceub.fsw.agenda.exception.DatabaseException;
import br.uniceub.fsw.agenda.model.vo.MenuVO;
import br.uniceub.fsw.agenda.model.vo.CidadeVO;
import br.uniceub.fsw.agenda.model.vo.BairroVO;
import br.uniceub.fsw.agenda.model.facade.ManterBairroFacade;
import br.uniceub.fsw.agenda.model.vo.UFVO;
import br.uniceub.fsw.agenda.util.HttpRequestWithModifiableParameters;
import br.uniceub.fsw.agenda.util.NumberUtils;
import java.io.*;
import java.net.*;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author Bruno Schifer
 */
public class ManterBairroController extends GenericServlet {
    private String nomeTela = "/manterBairro/manterBairro.jsp";
    public void iniciarTela(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Integer idBairro = NumberUtils.toInteger(request.getParameter("idBairro"));
        String noBairro = request.getParameter("noBairro");
        String sgUf = request.getParameter("sgUf");
        Integer idCidade = NumberUtils.toInteger(request.getParameter("idCidade"));
        
        //Facades
        ManterBairroFacade facadeBairro = new ManterBairroFacade();
        
        try {
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeBairro.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);
            
            List<UFVO> listaUF = facadeBairro.findAllUF();;
            request.setAttribute("listaDeUF", listaUF);

            List<CidadeVO> listaCidade = facadeBairro.findAllCidade(sgUf);
            request.setAttribute("listaDeCidade", listaCidade);
            
            List<BairroVO> listaBairro = facadeBairro.findAllBairro(idBairro, noBairro, idCidade);
            request.setAttribute("listaDeBairro", listaBairro);
        } catch (BusinessException ex) {          
            request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {            
            request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        

        RequestDispatcher rd = request.getRequestDispatcher(nomeTela);
        rd.forward(request, response);        
    }   
    
    public void limpar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        wrapper.setParameter("idBairro", "");
        wrapper.setParameter("noBairro", "");
        wrapper.setParameter("idCidade", "");
        wrapper.setParameter("sgUf", "");
        
        iniciarTela(wrapper, response);
    }

    public void listar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //pegar parametros da tela
        String noBairro = request.getParameter("noBairro");
        Integer idCidade = NumberUtils.toInteger(request.getParameter("idCidade"));

        //Facades
        ManterBairroFacade facadeBairro = new ManterBairroFacade();
        
        try {
            
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeBairro.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);

            //buscar lista de ufs
            List<UFVO> listaUF = facadeBairro.findAllUF();
            request.setAttribute("listaDeUF", listaUF);

            //buscar lista de cidades
            List<CidadeVO> listaCidade = facadeBairro.findAllCidade();
            request.setAttribute("listaDeCidade", listaCidade);

            // Busca lista de Bairro
            List<BairroVO> listaBairro = facadeBairro.findAllBairro(null, noBairro, idCidade);
            request.setAttribute("listaDeBairro", listaBairro);
            
        } catch (BusinessException ex) {
            request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
            request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }

        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        wrapper.setParameter("idBairro", "");
        wrapper.setParameter("noBairro", "");
        wrapper.setParameter("idCidade", "");
        wrapper.setParameter("sgUf", "");
        
        RequestDispatcher rd = request.getRequestDispatcher(nomeTela);
        rd.forward(wrapper, response);
    }
    
    public void inserir(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        String noBairro = request.getParameter("noBairro");
        Integer idCidade = NumberUtils.toInteger(request.getParameter("idCidade"));
        
        //facade
        ManterBairroFacade facade = new ManterBairroFacade();
        
        //montar entidade que sera gravada
        BairroVO bairro = new BairroVO();
        bairro.setNoBairro(noBairro);
        CidadeVO cidade = new CidadeVO();
        cidade.setIdCidade(idCidade);
        bairro.setCidade(cidade);
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        try {
            facade.inserirBairro(bairro);
                        
            wrapper.setParameter("idBairro", "");
            wrapper.setParameter("noBairro", "");
            wrapper.setParameter("idCidade", "");
            wrapper.setParameter("sgUf", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

    public void alterar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idBairro = NumberUtils.toInteger(request.getParameter("idBairro"));
        String noBairro = request.getParameter("noBairro");
        Integer idCidade = NumberUtils.toInteger(request.getParameter("idCidade"));
        
        //facade
        ManterBairroFacade facade = new ManterBairroFacade();
        
        //montar entidade que sera atualizada
        BairroVO bairro = new BairroVO();
        bairro.setIdBairro(idBairro);
        bairro.setNoBairro(noBairro);
        CidadeVO cidade = new CidadeVO();
        cidade.setIdCidade(idCidade);
        bairro.setCidade(cidade);
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        try {
            facade.alterarBairro(bairro);
                        
            wrapper.setParameter("idBairro", "");
            wrapper.setParameter("noBairro", "");
            wrapper.setParameter("idCidade", "");
            wrapper.setParameter("sgUf", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

    public void consultar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idBairro = NumberUtils.toInteger(request.getParameter("idBairro"));
        
        //facade
        ManterBairroFacade facadeBairro = new ManterBairroFacade();
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);

        try {
            BairroVO bairro = facadeBairro.findBairroById(idBairro);

            wrapper.setParameter("idBairro", bairro.getIdBairro().toString());
            wrapper.setParameter("noBairro", bairro.getNoBairro());
            wrapper.setParameter("idCidade", bairro.getCidade().getIdCidade().toString());
            wrapper.setParameter("sgUf", bairro.getCidade().getUf().getSgUf());
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);        
    }

    public void excluir(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idBairro = NumberUtils.toInteger(request.getParameter("idBairro"));
        
        //facade
        ManterBairroFacade facadeBairro = new ManterBairroFacade();
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        BairroVO bairro = new BairroVO();
        bairro.setIdBairro(idBairro);
       
        try {
            facadeBairro.excluirBairro(bairro);

            wrapper.setParameter("idBairro", "");
            wrapper.setParameter("noBairro", "");
            wrapper.setParameter("idCidade", "");
            wrapper.setParameter("sgUf", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

}
